<p>不能在synchronized中使用<code> String </code>或 包装的原生类型作为锁对象。因为它们已被池化并可以重复使用。
  对于<code> Boolean </code>对象来说，情况甚至更糟，因为<code> Boolean </code>只有两个实例，<code> Boolean.TRUE </code>和<code> Boolean.FALSE </code>，并且每个使用布尔值的类都将引用两者之一</p>
<h2>不规范代码示例</h2>

<pre>
private static final Boolean bLock = Boolean.FALSE;
private static final Integer iLock = Integer.valueOf(0);
private static final String sLock = "LOCK";

public void doSomething() {

  synchronized(bLock) {  // Noncompliant
    // ...
  }
  synchronized(iLock) {  // Noncompliant
    // ...
  }
  synchronized(sLock) {  // Noncompliant
    // ...
  }
</pre>
<h2>正确代码示例</h2>

<pre>
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
private static final Object lock3 = new Object();

public void doSomething() {

  synchronized(lock1) {
    // ...
  }
  synchronized(lock2) {
    // ...
  }
  synchronized(lock3) {
    // ...
  }
</pre>
<h2>更多</h2>

<ul>
<li> <a href="https://www.securecoding.cert.org/confluence/x/rQGeAQ">CERT, LCK01-J</a> - Do not synchronize on objects that may be reused</li>
</ul>

